# -*- coding: utf-8 -*-
"""
Created on Fri Dec  1 10:13:51 2023

@author: asus
"""

# In[1]:
import random
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

import simpy

plt.rcParams["font.sans-serif"] = ["SimHei"] 
plt.rcParams["axes.unicode_minus"] = False 

# In[2]:
weekday_choose = '周一'

# In[4]:
df = pd.read_csv('./data/domestic_airlines.csv')
chosen_data = df[
        (
            df[weekday_choose + '班期'] == weekday_choose + '有班期'
            ) & (df['降落机场'] == '周水子机场')
    ]

# In[5]:
filtered_data = chosen_data[
        [
            '出发城市', 
            '里程（公里）', 
            '航班班次', 
            '航空公司', 
            '机型', 
            '降落时间', 
            '起飞机场', 
            '降落机场',
            ]
        ]

# In[6]:
"""
...
涉及到飞机的 OOOI 逻辑，信号是通过ACARS自动发送的，
也就是利用飞机的停留刹车传感器、
空地临近电门等传感器的实时信号产生的。

实际起飞时间：

飞机主轮离地、由于主起落架减震支柱不再受到飞机的重力而伸出的瞬间。

实际降落时间：

飞机主轮接触地面、由于主起落架减震支柱受到飞机的重力而压缩的瞬间。

https://www.zhihu.com/question/64808321/answer/963410986
"""

flight_table = pd.DataFrame(
        columns=[
            'name', 
            'from_city', 
            'from_airport', 
            'flight_miles', 
            'arrival_time', 
            'takeoff_time',
            'airline_company',
            'aircraft_model'])

# In[7]:
flight_table['name'] = filtered_data['航班班次']
flight_table['from_city'] = filtered_data['出发城市']
flight_table['from_airport'] = filtered_data['起飞机场']
flight_table['flight_miles'] = filtered_data['里程（公里）']
flight_table['arrival_time'] = pd.to_datetime(
    filtered_data['降落时间'], format='%H:%M'
    ).dt.time
flight_table['airline_company'] = filtered_data['航空公司']
flight_table['aircraft_model'] = filtered_data['机型']
flight_table = flight_table.sort_values(
        by='arrival_time'
        )
flight_table = flight_table.reset_index()

# In[8]:
flight_table['hour'] = flight_table['arrival_time']
flight_table['hour'] = flight_table['hour'].apply(
    lambda x: x.hour)

# In[9]:
hourly_counts = (flight_table.groupby(
    flight_table['hour']).size())
"""
代码产生的 DataFrame 形式如下：

hour
0     10
8      2
9     11
...   ...
22    10
23    15

其中右侧一列没有列名。
下面的代码要给右侧的一列加上列名。
"""
hourly_counts = hourly_counts.reset_index(
    name='count'
    )

# In[10]:
hourly_counts['average_arrival'] = (
    60 / hourly_counts['count'])

# In[11]:
df_to_plot = hourly_counts[['hour', 'count']]
new_hours = pd.DataFrame({'hour': range(24)})
# 使用 merge 方法将新的小时数据合并到原始 DataFrame
# 并使用 0 填充缺失的 count 值
df_to_plot = pd.merge(
    new_hours, 
    df_to_plot, 
    on='hour', 
    how='left').fillna(0)

# In[12]:
fig, ax = plt.subplots(dpi=300)
sns.barplot(
    x=df_to_plot['hour'],
    y=df_to_plot['count'],
    ax=ax)
df_to_plot['count'].plot.line(
    lw=0.75, c='k', ax=ax)
ax.set_xlabel("时间（小时）")
ax.set_ylabel("到达航班数量")
ax.set_title(
    "大连机场" + weekday_choose + " 24 小时内航班到达量变化情况")
